#!/usr/bin/perl
# Luiz Flavio Rojo Fernandes <lrojo@uoldiveo.com>
# Mon Mar 26 15:23:43 BRT 2012
#
# Contabiliza o total de hits, misses e requests total e faz o calculo do hit rate
# Deve rodar na cron de 5 em 5 minutos e configurado no cacti
# - Utiliza seek para fazer leitura continua no log do marrakesh

use Sys::Hostname qw(hostname);
use Sys::Syslog;
use POSIX;
my $host = hostname;

# Vars
my $REGEXP = '(cache)';
my $REGEXP1 = '(hit)';
my $REGEXP2 = '(miss)';

my @LOGS = ("/export/logs/marrakesh/cache.log");
my $SEEKDB = "/export/scripts/graficos/statistics.db";
my $date= strftime('%s', localtime);

my $HOSTNAME_CACTI="$host";
my $SERVICE_DESCRIPTION="Lighttpd Statistics - Cache UOLMais";

my $LOG_NAME = "logger";
my $SYSLOG_FACILITY= "local5.info";

# Start Reading
my %views=();

# le posicoes
open(SEEK, $SEEKDB) or die("Erro ao tentar abrir o arquivo $SEEKDB\n");
my $seeks = <SEEK>;
close(SEEK);
# percorre array de logs e os abre
foreach my $log (@LOGS) {
    open(LOG, $log) or die("Erro ao tentar abrir o arquivo $log\n");
    $currsize = (stat($log))[7];

# procura a posicao no .db, verifica seu tamanho e se o arquivo foi truncado e move o ponteiro para a posicao salva
    if ($seeks =~ /$log=(\d+)\|(\d+);/) {
        if ($currsize < $2) {
            seek(LOG, 0, 0); 
	}
        else {
            seek(LOG, $1, 0);
	}
    }
    else {
         seek(LOG, 0, 0);
    }

# le log da ultima posicao e contabiliza matchs da regexp
    while(<LOG>) {
        chomp($_);

        if($_ =~ /$REGEXP/) {
            $views{"total"}++;
        }
        if($_ =~ /$REGEXP1/) {
            $views{"hit"}++;
        }
        if($_ =~ /$REGEXP2/) {
            $views{"miss"}++;
        }
    }

$PERCENTAGE =  ($views{"hit"}/$views{"total"})*100;

# disponibiliza valores de SEEK/SIZE do log atual
   $newseekDB .= $log ."=" .tell(LOG) ."|" .$currsize .";";
   close(LOG);
}

# Salva no seekDB
open(SEEK,"> $SEEKDB") or die("Erro ao tentar abrir o arquivo $seekDB\n");
print SEEK "$newseekDB";
close(SEEK);

# Envia um status de warning, via syslog-ng para o agregador nagios
#print("UOLGRAPH lighttpd_video_statistics 10 " .$HOSTNAME_CACTI. " AGENTE_LASTRUN " .$date. " lighttpd_video_served " .$views{"logerror"});
syslog ($SYSLOG_FACILITY, "UOLGRAPH marrakesh_statistics 10 " .$HOSTNAME_CACTI. " AGENTE_LASTRUN " .$date. " hit " .$views{"hit"});
syslog ($SYSLOG_FACILITY, "UOLGRAPH marrakesh_statistics 10 " .$HOSTNAME_CACTI. " AGENTE_LASTRUN " .$date. " miss " .$views{"miss"});
syslog ($SYSLOG_FACILITY, "UOLGRAPH marrakesh_statistics 10 " .$HOSTNAME_CACTI. " AGENTE_LASTRUN " .$date. " total " .$views{"total"});
syslog ($SYSLOG_FACILITY, "UOLGRAPH marrakesh_statistics 10 " .$HOSTNAME_CACTI. " AGENTE_LASTRUN " .$date. " hit_rate " . "$PERCENTAGE");
